package es

import (
	"context"
	elastic "github.com/olivere/elastic/v7"
)

type ESClient struct {
	*elastic.Client
}

func NewEsClient(info *ESConfig) (*ESClient, error) {
	client, err := elastic.NewClient(elastic.SetSniff(false), elastic.SetURL(info.ESHost))
	if err != nil {
		return nil, err
	}

	_, _, err = client.Ping(info.ESHost).Do(context.Background())
	if err != nil {
		return nil, err
	}

	return &ESClient{client}, nil
}

func (client *ESClient) CreatByStruct(index string, par interface{}) (*elastic.IndexResponse, error) {
	return client.Index().
		Index(index).
		BodyJson(par).
		Do(context.Background())
}

func (client *ESClient) CreatByString(index, par string) (*elastic.IndexResponse, error) {
	return client.Index().
		Index(index).
		BodyJson(par).
		Do(context.Background())
}

//
//// 定义一个私有的变量
//var esClient *elastic.Client
//var err1 error
//
//// 设定原子操作
//var once sync.Once
//
//// GetEsClient 获取以es连接
//func GetEsClient(url string) *elastic.Client {
//	once.Do(func() {
//		client, err = elastic.NewClient(elastic.SetSniff(false), elastic.SetURL(host))
//		if err != nil {
//			panic(err)
//		}
//
//		_, _, err = client.Ping(host).Do(context.Background())
//		if err != nil {
//			panic(err)
//		}
//		//fmt.Printf("Elasticsearch returned with code %d and version %s\n", code, info.Version.Number)
//
//		_, err = client.ElasticsearchVersion(host)
//		if err != nil {
//			panic(err)
//		}
//	})
//	return client
//}
//
///***************************创建添加***************************/
//
//// AddStringDoc 增加一个字符串至文档
//func AddStringDoc(esc *elastic.Client, index, par string) error {
//	put1, err := esc.Index().
//		Index(index).
//		BodyJson(par).
//		Do(context.Background())
//	if err == nil {
//		zlog.Infof("AddStringDoc %s successful:%v ", index, put1)
//	}
//
//	return err
//}
//
//// AddDoc 增加一个对象至文档
//func AddDoc(esc *elastic.Client, index string, par interface{}) error {
//	put1, err := esc.Index().
//		Index(index).
//		BodyJson(par).
//		Do(context.Background())
//	if err == nil {
//		zlog.Infof("AddStructDoc %s successful:%v ", index, put1)
//	}
//
//	return err
//}
//
//// AddDocID 增加一个对象至文档 带id
//func AddDocID(esc *elastic.Client, index, id string, par interface{}) error {
//	put1, err := esc.Index().
//		Index(index).
//		Id(id).
//		BodyJson(par).
//		Do(context.Background())
//	if err == nil {
//		zlog.Infof("AddStructDoc %s successful:%v ", index, put1)
//	}
//
//	return err
//}
//
//// UpdateDocID 更新一个对象至文档 带id  确实是哥对象，不能是字符串
//func UpdateDocID(esc *elastic.Client, index, id string, par interface{}) error {
//	put1, err := esc.Update().
//		Index(index).
//		Id(id).
//		Doc(par).
//		Do(context.Background())
//	if err == nil {
//		zlog.Infof("UpdateDocID %s successful:%v ", index, put1)
//	}
//
//	return err
//}
//
//// DeleteDocID 删除一个对象至文档 带id
//func DeleteDocID(esc *elastic.Client, index, id string) error {
//	put1, err := esc.Delete().
//		Index(index).
//		Id(id).
//		Do(context.Background())
//	if err == nil {
//		zlog.Infof("DeleteDocID %s successful:%v ", index, put1)
//	}
//
//	return err
//}
//
//// GetDocID 得到一个对象
//func GetDocID(esc *elastic.Client, index, id string) (string, error) {
//	get1, err := esc.Get().
//		Index(index).
//		Id(id).
//		Do(context.Background())
//	if err == nil {
//		value, _ := get1.Source.MarshalJSON()
//		zlog.Infof("Got document %s in version %d from index %s, type %s,value:%s\n", get1.Id, get1.Version, get1.Index, get1.Type, string(value))
//		return string(value), err
//	}
//
//	return "", err
//}
//
///***************************创建mapping***************************/
//
//// InitMapping 创建 elasticSearch 的 Mapping
//func InitMapping(esc *elastic.Client, esIndexName string, typeMapping string) error {
//	ctx := context.Background()
//	// Use the IndexExists service to check if a specified index exists.
//	exists, err := esc.IndexExists(esIndexName).Do(ctx)
//	if err != nil {
//		zlog.Infof("InitMapping" + err.Error())
//		return err
//	}
//
//	if !exists {
//		// Create a new index.
//		createIndex, err := esc.CreateIndex(esIndexName).Do(ctx)
//		if err != nil {
//			zlog.Infof("CreateIndex" + err.Error())
//			return err
//		}
//		if !createIndex.Acknowledged {
//			// Not acknowledged
//			return errors.New("create index:" + esIndexName + ", not Ack nowledged")
//		}
//		putresp, err := esc.PutMapping().Index(esIndexName).BodyString(typeMapping).Do(context.TODO())
//		// 新建 mapping
//		if err != nil {
//			zlog.Infof("NewIndicesCreateService" + err.Error())
//			return err
//		}
//		if !putresp.Acknowledged {
//			// Not acknowledged
//			return errors.New("create mapping fail, esIndexName:" + esIndexName + ", not Ack nowledged")
//		}
//	}
//	return nil
//}
